#pragma once
#include <QCoreApplication>
#include <QFile>
#include <QXmlStreamReader>
#include <QDebug>
#include <QSharedPointer>
#include <QDir>
#include <QDomDocument>
#include <QStringList>

#include "Common.h" 


using namespace SignalSystem;

class protocolParser : public QObject
{
public:
    protocolParser(const QString filePath, QObject* parent = nullptr);
    ~protocolParser();

    QSharedPointer<SignalSystem::Link4A> getLink4A();
    QSharedPointer<SignalSystem::ConventSimulation> getConventSimulation();
    QSharedPointer<SignalSystem::Link11> getLink11();
    QSharedPointer<SignalSystem::Link16> getLink16();
    QSharedPointer<SignalSystem::TTNT> getTTNT();
    QSharedPointer<SignalSystem::HAVEQUICK> getHAVEQUICK();
    QSharedPointer<SignalSystem::SINCGARS> getSINCGARS();
    QSharedPointer<SignalSystem::EPLRS> getEPLRS();
    QSharedPointer<SignalSystem::UV> getUV();
    QSharedPointer<SignalSystem::radioStation171> getRadioStation171();


private:

    /// <summary>
    /// 解析常规模拟
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    QString getFMOffset(QDomElement root);


    // link11
    // 解析帧长
    double parseFrameLength(QDomElement root);
    // 单音/多音的调制方式
    QString parseModulationType(QDomElement root);

    /// <summary>
    /// link4A 和11获取频率和主从的方式一样
    /// </summary>
    /// <param name="root"></param>
    // 获取频集
    QVector<quint64> getParseFrequency(const QDomElement& root);
    // 获取主从
    QVector<QSharedPointer<Link4AMS>> parseMasterSlave(const QDomElement& root);

    /// <summary>
    /// link16
    /// </summary>
    /// <param name="root"></param>
    // 工作模式
    QString detectWorkMode(QDomElement root);
    // 业务类型
    QString checkServiceType(QDomElement root);
    QVector<QSharedPointer<Link4AMS>> parseNetRoles(QDomElement root);
    // 帧格式类型获取
    QString getFrameFormat(QDomElement root);
    // 脉冲宽度
    double getPulseWidth(QDomElement root);
    // 载波中心偏移
    int getCarrierOffset(QDomElement root);
    // 加密状态
    bool checkEncryption(QDomElement root);
    // 粗同步、精同步、数据域频集
    QSharedPointer<FrequencyHops> analyzeFrequencyHops(QDomElement root);
    // 时隙号
    QMap<QString, QStringList> getSlotNumbers(QDomElement root);

    // TTNT获取速率模式
    QString getRateMode(QDomElement root);

    //HAVEQUICK
    // 型号类型
    QString getModeType(QDomElement root);
    // 获取跳速模式
    QString getHoppingSpeedMode(QDomElement root);

    // EPLRS
    // 获取波形模式
    QString getWaveMode(QDomElement root);

    // 获取跳速 
    double getHoppingSpeed(QDomElement root);

    // 获取空口速率
    QString getOrificeSpeed(QDomElement root);

private:
    // 获取频集
    QVector<quint64> getFreqPoints(QDomElement root, const QString& freqPointsID);
    // 获取抗干扰策略id
    QString getAntijamPolicyID(QDomElement root);
    // 获取WaveLinkID
    QString getDefaultWaveLinkID(QDomElement root);
    // 获取getFunctionParamID
    QString getFunctionParamID(QDomElement root);
    // 获取pulseID
    QString getPulseID(QDomElement root);

private:
    QDomElement m_root;

    QMap<int, QString> m_modulationMap = {
        {804, "FM"}, {810, "MSK"}, {812, "BPSK"}
    };
};

